package db

import (
	"github.com/hyahm/goconfig"
	"github.com/hyahm/golog"
	"github.com/hyahm/gomysql"
)

var db *gomysql.Db

func ConnectMysql() {
	conf := gomysql.Sqlconfig{
		UserName: goconfig.ReadString("mysql.user", "test"),
		Password: goconfig.ReadPassword("mysql.password", "123456"),
		Host:     goconfig.ReadString("mysql.host", "172.27.208.1"),
		Port:     goconfig.ReadInt("mysql.port", 3306),
		DbName:   goconfig.ReadString("mysql.dbnmae", "test"),
	}
	var err error
	db, err = conf.NewDb()
	if err != nil {
		golog.Fatal(err)
	}
	golog.Info("connect mysql success")
	user := User{
		Username: "ttttttt",
		Password: "lajsdlkfn;lkasjdf;ijs",
		Roles:    []string{"play", "env", "run"},
	}
	err = user.create()
	// user.update()
	// err = delete(1)
	// // user.update()
	if err != nil {
		golog.Fatal(err)
	}
	// // 增加数据
	// err = user.create()
	// if err != nil {
	// 	golog.Fatal(err)
	// }
	// golog.Info("id: ", user.ID)
	// 查询一行
	users, err := selectAll()
	// users, err := readAll()
	// err = user.read()
	if err != nil {
		golog.Fatal(err)
	}
	// golog.Infof("%#v", user)
	for _, u := range users {
		golog.Infof("%#v", u)
	}

}

// default: 如果值为零值得话， 就用默认值， insert的时候用到
// force: 对应修改的， 如果值为零值得话，就强制修改， 否则就不改
type User struct {
	ID       int64    `json:"id,omitempty" db:"id,default"`
	Username string   `json:"username" db:"username,default"`
	Password string   `json:"password" db:"password,default"`
	Roles    []string `json:"roles" db:"roles"`
}

func (user *User) create() error {
	// 基础原生
	// res, err := db.Exec("insert into user(username, password) values(?,?)", user.Username, user.Password)
	// if err != nil {
	// 	return err
	// }
	// user.ID, err = res.LastInsertId()

	// 第一次封装
	// var err error
	// user.ID, err = db.Insert("insert into user(username, password) values(?,?)",
	// 	user.Username, user.Password)
	// 第二次封装
	ids, err := db.InsertInterfaceWithID(user, "insert into user($key) values($value)")
	if err != nil {
		return nil
	}
	user.ID = ids[0]
	return err
}

// 高级查询
func selectAll() ([]User, error) {
	// 查多行
	users := make([]User, 0)
	err := db.SelectIn(&users, "select * from user ")
	return users, err
}

// 查询单行
func (user *User) read() error {
	err := db.QueryRow("select id,username,password from user").Scan(
		&user.ID, &user.Username, &user.Password,
	)
	if err != nil {
		return err
	}
	return nil
}

func readAll() ([]User, error) {
	// db.QueryContext()
	rows, err := db.Query("select id,username,password from user where id in (2,3,4,5)")
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	users := make([]User, 0)
	for rows.Next() {
		user := User{}
		err := rows.Scan(&user.ID, &user.Username, &user.Password)
		if err != nil {
			golog.Error(err)
			continue
		}
		users = append(users, user)
	}
	return users, nil
}

func (user *User) update() error {
	// res, err := db.Exec("update user set username=?, password=? where id=?",
	// 	user.Username, user.Password, user.ID)
	// if err != nil {
	// 	return err
	// }
	// affectRows, err := res.RowsAffected()
	// golog.Info(affectRows)
	// 第一次封装
	// affectRows, err := db.Update("update user set username=?, password=? where id=?",
	// 	user.Username, user.Password, user.ID)
	// golog.Info(affectRows)
	// 第二次封装
	affectRows, err := db.UpdateInterface(user,
		"update user set $set where id=?", user.ID)
	golog.Info(affectRows)
	return err
}

func delete(id interface{}) error {
	// res, err := db.Exec("delete from user where id=?", id)
	// if err != nil {
	// 	return err
	// }
	// affectRows, err := res.RowsAffected()
	// golog.Info(affectRows)
	// 第一次封装

	affectRows, err := db.Delete("delete from user where id=?", id)
	golog.Info(affectRows)
	return err
}
